<?php
//测试控制器类
class IndexController extends Controller{
    private $category;//栏目

   	public function __init(){
   		$this->category=S('category');//读取栏目缓存
   	}

    //显示首页
    public function index(){
         // Data::channelLevel 获得多级目录列表（多维数组）
        $category=Data::channelLevel($this->category);
         $this->assign('category',$category);
        // 分配男鞋商品
        // 分配鞋子子栏目数据
        $pid1=M('category')->where('pid=1')->all();
        $this->assign('pid1',$pid1);
        //取男鞋下8个商品
        $map['category_cid']=array('IN','1,5,6,7,8'); 
        $shoes=M('goods')->where($map)->limit(8)->all();
        $this->assign('shoes',$shoes);
        // 分配女鞋商品
        // 分配女鞋子栏目数据
        $pid2=M('category')->where('pid=2')->all();
        $this->assign('pid2',$pid2);
        $map['category_cid']=array('IN','2,9,10,11,12'); 
        $nv=M('goods')->where($map)->limit(8)->all();
        $this->assign('nv',$nv);       
        $this->display();
    }

    //**************  列表页  ******************
    public function category(){
       // Data::channelLevel 获得多级目录列表（多维数组）
      $category=Data::channelLevel($this->category);
       $this->assign('category',$category);
       // 分配当前位置的栏目
       $cid=Q('get.cid',0,'intval');
       $cat=M('category')->find($cid);
       $this->assign('cat',$cat);
    	//获得当前栏目属性
    	$attr=$this->getAttr();
      // p($attr);die;
    	$this->assign('attr',$attr);
    	//获得商品属性
    	$this->assignCategoryGoods();
    	$this->display('list.html');
    }

    //获得栏目属性
    public function getAttr(){
      /**
       * S 属性筛选变量
       * 如果不存在S变量,产生默认的S变量
       * 比如说，有3个属性 0-0-0
       */
      $s=Q('get.s',null,'trim');
      //栏目cid
      $cid=Q('get.cid');
      //栏目的商品类型id
      $cat_id=$this->category[$cid]['cat_id'];
      // p($cat_id);die;
      if(!$s){
        //没有s变量时， 读取该栏目所属的类型属性
        //统计每个类型属性id,对应的商品属性值的数量
        $sql ="SELECT count(*) AS c FROM attribute a JOIN goods_attr ga
        ON a.attr_id=ga.attr_id 
        WHERE a.cat_id=$cat_id 
        GROUP BY ga.attr_id";  

        $db = M();//统计商品属性attr_id的总数
        $count = count($db->query($sql));
        // p($db->query($sql));die; 
        $s='';
        for($i=0;$i<$count;$i++){
          $s.='0-';
        }
        $s= substr($s,0,-1);//返回字符串 从0开始到-1,去掉-
        go(U('category',array('cid'=>$cid,'s'=>$s)));
        // 跳转到当前指定栏目和指定组合属性的页面
      }else{
        //有s有值时，在当前栏目对应的商品类型下
        //获得当前所有商品的属性用于搜索,
        $sql ="SELECT * FROM attribute a JOIN goods_attr ga
        ON a.attr_id=ga.attr_id 
        WHERE a.cat_id=$cat_id 
        GROUP BY ga.attr_id";
        $db=M();
        $attr = $db->query($sql);
        // p($attr);
        /**
         * 取商品属性表里每一个属性的属性值
         * 
         * 取出商品表里同attr_id的,按属性值,attr_value归类,
         * 一起存入_value字段中
         */
        foreach($attr as $id=>$v){
          $sql="select * from goods_attr ga 
            WHERE {$v['attr_id']}=ga.attr_id
           GROUP BY attr_value ";
          //得到一个二维数组,装同一属性值的
          // p($db->query($sql));
          $attr[$id]['_value']=$db->query($sql);
        }
        // p($attr);die;
        return $attr;
      }
    }

    //获取商品
    private function assignCategoryGoods(){
      //属性处理，去掉值为0的属性
    	$s=Q('s',0,'trim');
    	$s=explode('-',$s);
    	$s=array_filter($s);// 用回调函数过滤数组中的单元 
    	//栏目
    		$cid=Q('cid',0,'intval');
      //没有筛选属性时，获取所有商品
    	if(empty($s)){
	    	$db= M('goods');
        $catdata=M('category')->where("pid=$cid")->getField('cid',true);
        $catdata[]=$cid;//将本身栏目的cid也压人
	    	$map['category_cid']=array('IN',$catdata);
        // 列表页每页商品显示的数量
	    	$page= new Page($db->where($map)->count(),4);
	    	$data =$db->where($map)->limit($page->limit())->all();
    	}else{
    		$map['id']=array('IN',$s);//取属性id对应的值
    		$attr_value=M('goods_attr')->where($map)->getField('attr_value',true);
        // p($attr_value);die;
    		$attr_value="'".implode("','",$attr_value)."'";
        //属性值用逗号隔开
        //商品表和商品属性表关联,
        //如果属性的值数量相同时就为选中的商品
    		$sql = "SELECT count(*) c FROM goods_attr a JOIN goods g ON a.goods_gid=g.gid
    			WHERE a.attr_value IN({$attr_value})
    			GROUP BY a.goods_gid having count(*)=".count($s);

        //分页处理
    		$count =M()->query($sql);
        $count=$count?$count:0;//如果存在现实它,否则为0

    		$page= new Page($count[0]['c'],1);
        // p($page);die;
    		$sql = "SELECT * FROM goods_attr a JOIN goods g ON a.goods_gid=g.gid
    			WHERE a.attr_value IN({$attr_value})
    			GROUP BY a.goods_gid having count(*)=".count($s);
    		$data=M()->query($sql);
    	}
      // p($data);die;
	    	$this->assign('data',$data);
	    	$this->assign('page',$page->show());
    }

//************************  详情页 *************************
    public function goods(){
      $gid=Q('gid',0,'intval');
      $db = M('goods');
        //分配商品
      $data= $db->find($gid);
      $this->assign('data',$data);
      //分配商品属性
      $attr=$this->getGoodsAttr($gid);
      $this->assign('attr',$attr);
      //分配导航栏目   Data::channelLevel 获得多级目录列表（多维数组）
      $category=Data::channelLevel($this->category);
      $this->assign('category',$category);
       // 分配当前位置的栏目
      $cid=$data['category_cid'];
      $cat=M('category')->find($cid);
      $this->assign('cat',$cat);
      //分配详情页商品图片数据
      $img=M('goods_gallery')->where("goods_gid=$gid")->all();
      // p($img);die;
      $this->assign('img',$img);
      // 
      $this->display('goods.html');
    }

    /**
     * 商品详情页获得货品信息
     * @return [type] [description]
     */
    public function getProduct(){
      $id=Q('id',0,'trim');
      // p($id);die;
      $map['goods_attr']=$id;//属性组合id
      $data =M('product')->where($map)->find();//获取当前货品数据
      if($data){
          $return=array('status'=>'success','data'=>$data);
      }else{
          $return =array('status'=>'error','message'=>'商品不存在');
      }
      echo  json_encode($return);//返回 $return值的JSON形式
      exit;
    }

    /**
     * @param  [type] $gid [description]
     * @return [type]      [description]
     */
    public function getGoodsAttr($gid){
        $db= M("goods");
        //获得属性名称
        $sql = "SELECT * FROM attribute a JOIN goods_attr ga
        ON a.attr_id=ga.attr_id
        WHERE ga.goods_gid=$gid GROUP BY a.attr_id 
        ORDER BY ga.attr_id ASC";
        $attr =$db->query($sql);
        //获得属性值       
        foreach($attr as $id=>$v){
            $sql="select * from goods_attr WHERE attr_id={$v['attr_id']}
            AND goods_gid=$gid";
          $attr[$id]['attr']=$db->query($sql);
            
        }
        return $attr;
    }
}//首页控制器类
